
class Student{
    private String name;
    private int age;
    private double score;
    //静态成员变量的初始化
    //1.就地初始化
    private static String className="1班";
    //2.通过set 和get 方法进行初始化
    public void setClassName(String className){
        Student.className=className;
    }
    public String getClassName1(){
        return  Student.className;
    }
    //3.通过构造方法进行初始化
    public Student(String name, int age, double score){
        this.name=name;
        this.age=age;
        this.score=score;
        className="2班";
        System.out.println("构造方法");
    }
    //对象的打印
    @Override
    public String toString() {
        return "Student{" +
                "姓名='" + name + '\'' +
                ", 年龄=" + age +
                ", 分数=" + score +
                '}';
    }

    //静态代码块(定义在类当中，方法的外边)
    //当类被加载的时候，就会触发（main2中会通过类访问getClassName，所以类会被加载）
    //若果有多个静态代码块，那么就看定义的先后顺序
    static{
        //一般用来初始化静态的成员变量
        className="114班";
        System.out.println("静态代码块");
    }

    //实例代码块
    {
        this.name="hhhh";
        System.out.println("实例代码块");
    }




//    public Student(String name, int age, double score) {
//        this.name = name;
//        this.age = age;
//        this.score = score;
//    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }


    public void doClass(){
        System.out.println(this.name+"在上课");
    }
    public void show(){
        System.out.println(this.name+" "+this.age+" "+this.score+" "+Student.className);
        //在非静态方法（普通方法）当中，是可以直接调用静态方法的
        getClassName();
    }
    //静态成员方法->类方法->不依赖于对象
    //在静态方法中，不能能够直接调用非静态方法，因为静态方法不依赖于对象，可以直接通过类名进行访问
    //但是，非静态方法（普通方法）依赖对象，需要通过对象的引用访问
    public static String getClassName(){
        //在方法中，使用static关键字的注意事项
        //1.不能使用this
        //name 是依赖于对象的，name的调用是依赖于this的，但是调用getClassName的时候，
        // getClassName是不依赖于对象的，所以不能去调用一个依赖于对象的name
//        this.name="张三";
        return Student.className;
    }
}

public class Test {

    public static void main(String[] args) {
        Student stu1=new Student("张三",20,89.5);
        System.out.println(stu1);
    }

    public static void main2(String[] args) {
        //先执行静态代码块（多个静态代码块就要看定义顺序）
        //再执行实例代码块（多个实例的就要看定义顺序）
        //再执行构造方法（看具体调用了哪个构造方法）
        System.out.println(Student.getClassName());
        Student stu1=new Student("1212",45,555);
        stu1.show();
        System.out.println("===================");
        //静态代码块只会被执行一次，也就是说，类只会被加载一次
        Student stu2=new Student("333",50,55);
        stu2.show();

    }

    public static void main1(String[] args) {
        Student stu1=new Student("zhangsan",13,63.5);
        stu1.show();
        System.out.println(Student.getClassName());
        stu1.doClass();
        Student stu2=new Student("lisi",17,45);
        stu2.show();
        stu2.doClass();
        Student stu3=new Student("wangwu",33,83.5);
        stu3.show();
        stu3.doClass();
    }

}
